import face_recognition
import cv2
import numpy
from PIL import Image, ImageDraw, ImageFont

def face_recognition_init():
    global obama_image,obama_face_encoding,biden_image,biden_face_encoding,xs_image,xs_face_encoding,known_face_encodings,known_face_names,face_locations,face_encodings,face_names,process_this_frame
    # Load a sample picture and learn how to recognize it.
    obama_image = face_recognition.load_image_file("facenet/data/obama.jpg")
    obama_face_encoding = face_recognition.face_encodings(obama_image)[0]

    # Load a second sample picture and learn how to recognize it.
    biden_image = face_recognition.load_image_file("facenet/data/biden.jpg")
    biden_face_encoding = face_recognition.face_encodings(biden_image)[0]

    xs_image = face_recognition.load_image_file("facenet/data/xs.jpg")
    xs_face_encoding = face_recognition.face_encodings(xs_image)[0]

    # Create arrays of known face encodings and their names
    known_face_encodings = [
        obama_face_encoding,
        biden_face_encoding,
        xs_face_encoding
    ]
    known_face_names = [
        "Barack Obama",
        "Joe Biden",
        "谢晟"
    ]

    # Initialize some variables
    face_locations = []
    face_encodings = []
    face_names = []
    process_this_frame = True

def face_recognition_frame(font,frame,score):
    global obama_image,obama_face_encoding,biden_image,biden_face_encoding,xs_image,xs_face_encoding,known_face_encodings,known_face_names,face_locations,face_encodings,face_names,process_this_frame
    # Resize frame of video to 1/4 size for faster face recognition processing
    small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)
    # Convert the image from BGR color (which OpenCV uses) to RGB color (which face_recognition uses)
    rgb_small_frame = small_frame[:, :, ::-1]
    # Only process every other frame of video to save time
    if process_this_frame:
        # Find all the faces and face encodings in the current frame of video
        face_locations = face_recognition.face_locations(rgb_small_frame)
        face_encodings = face_recognition.face_encodings(rgb_small_frame, face_locations)

        face_names = []
        for face_encoding in face_encodings:
            # See if the face is a match for the known face(s)
            name = "陌生人"          
            face_distances = face_recognition.face_distance(known_face_encodings, face_encoding)
            #print(face_distances)
            # If a match was found in known_face_encodings, just use the first one.
            for i, face_distance in enumerate(face_distances):  
                if face_distance<score:              
                    #first_match_index = face_distances.index(face_distance)
                    name = known_face_names[i]
                    score=face_distance              

            face_names.append(name)

    process_this_frame = not process_this_frame
    # Display the results
    for (top, right, bottom, left), name in zip(face_locations, face_names):
        # Scale back up face locations since the frame we detected in was scaled to 1/4 size
        top *= 4
        right *= 4
        bottom *= 4
        left *= 4
       
        # 图像从OpenCV格式转换成PIL格式
        img_PIL = Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
        # 输出内容
        str = name
        draw = ImageDraw.Draw(img_PIL)
        if str=="陌生人":
            fillColor_pil = (255,0,0)
            fillColor_rgb = (0,0,255)
        else:
            fillColor_pil = (0,0,255)
            fillColor_rgb = (255,0,0)
        draw.text((left + 6, top - 40), str, font=font, fill=fillColor_pil)
        # 转换回OpenCV格式
        frame = cv2.cvtColor(numpy.asarray(img_PIL),cv2.COLOR_RGB2BGR)
        # Draw a label with a name below the face
        cv2.rectangle(frame, (left, top), (right, bottom), fillColor_rgb, 1)
       # font = cv2.FONT_HERSHEY_DUPLEX
       # cv2.putText(frame, name, (left + 6, bottom - 6), font, 1.0, (255, 255, 255), 1)   
    return frame 

if __name__ == "__main__":
    video_capture = cv2.VideoCapture(0)  
    # 字体  字体*.ttc的存放路径一般是： /usr/share/fonts/opentype/noto/ 查找指令locate *.ttc
    font = ImageFont.truetype('NotoSansCJK-Thin.ttc', 30)
    face_recognition_init()
    while True:
        # Grab a single frame of video
        ret, frame = video_capture.read()

        frame = face_recognition_frame(font,frame)

        # Display the resulting image
        cv2.imshow('Video', frame)

        # Hit 'q' on the keyboard to quit!
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    # Release handle to the webcam
    video_capture.release()
    cv2.destroyAllWindows()


